"""
数据库设置向导
帮助用户一步步设置Supabase数据库
"""

import os
import sys
import asyncio
from pathlib import Path

# 添加当前目录到路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

def print_step(step_num, title):
    """打印步骤标题"""
    print(f"\n=== 步骤 {step_num}: {title} ===")

def print_info(message):
    """打印信息"""
    print(f"ℹ️  {message}")

def print_success(message):
    """打印成功信息"""
    print(f"✅ {message}")

def print_error(message):
    """打印错误信息"""
    print(f"❌ {message}")

def print_warning(message):
    """打印警告信息"""
    print(f"⚠️  {message}")

async def main():
    """主设置流程"""
    print("🚀 MindMate 数据库设置向导")
    print("这个向导将帮助你设置Supabase数据库并迁移现有数据")
    
    # 步骤1: 检查现有数据
    print_step(1, "检查现有数据")
    
    data_dir = Path("./data")
    sessions_file = data_dir / "sessions.json"
    roles_file = data_dir / "roles.json"
    
    if sessions_file.exists():
        import json
        with open(sessions_file, 'r', encoding='utf-8') as f:
            sessions = json.load(f)
        print_success(f"找到 {len(sessions)} 个会话")
    else:
        print_warning("未找到会话文件")
        sessions = {}
    
    if roles_file.exists():
        with open(roles_file, 'r', encoding='utf-8') as f:
            roles = json.load(f)
        print_success(f"找到 {len(roles)} 个自定义角色")
    else:
        print_warning("未找到角色文件")
        roles = {}
    
    if not sessions and not roles:
        print_error("没有找到任何数据可以迁移")
        return
    
    # 统计消息数量
    total_messages = 0
    for session in sessions.values():
        total_messages += len(session.get('messages', []))
    print_info(f"数据概览: {len(sessions)} 个会话, {len(roles)} 个角色, {total_messages} 条消息")
    
    # 步骤2: 设置说明
    print_step(2, "Supabase 设置说明")
    print("请按以下步骤设置 Supabase:")
    print("1. 访问 https://supabase.com")
    print("2. 创建新账户或登录")
    print("3. 点击 'New Project' 创建新项目")
    print("4. 填写项目信息:")
    print("   - Name: MindMate")
    print("   - Database Password: 设置一个安全密码")
    print("   - Region: 选择离你最近的区域")
    print("5. 等待项目创建完成（通常需要2-3分钟）")
    
    input("\\n按回车键继续，当你已经创建好 Supabase 项目...")
    
    # 步骤3: 获取配置信息
    print_step(3, "获取配置信息")
    print("在 Supabase 项目中:")
    print("1. 进入 Settings > API")
    print("2. 找到以下信息:")
    print("   - Project URL (格式: https://xxx.supabase.co)")
    print("   - anon public key (以 'eyJ' 开头的长字符串)")
    
    print("\\n请输入你的配置信息:")
    
    supabase_url = input("Supabase URL: ").strip()
    if not supabase_url.startswith('https://') or not supabase_url.endswith('.supabase.co'):
        print_error("URL 格式不正确，应该是 https://xxx.supabase.co")
        return
    
    supabase_key = input("Supabase anon key: ").strip()
    if not supabase_key.startswith('eyJ'):
        print_error("密钥格式不正确，应该以 'eyJ' 开头")
        return
    
    # 步骤4: 设置环境变量
    print_step(4, "设置环境变量")
    
    # Windows 设置
    os.environ['SUPABASE_URL'] = supabase_url
    os.environ['SUPABASE_ANON_KEY'] = supabase_key
    
    print("环境变量已在当前会话中设置")
    print("为了永久保存，请运行以下命令:")
    print(f'setx SUPABASE_URL "{supabase_url}"')
    print(f'setx SUPABASE_ANON_KEY "{supabase_key}"')
    
    # 步骤5: 测试连接
    print_step(5, "测试数据库连接")
    
    try:
        from database.supabase_client import check_supabase_config, test_connection
        
        if not check_supabase_config():
            print_error("配置检查失败")
            return
            
        print_success("配置检查通过")
        
        if not test_connection():
            print_error("数据库连接失败，请检查配置信息")
            return
            
        print_success("数据库连接成功")
        
    except Exception as e:
        print_error(f"测试连接时出错: {e}")
        return
    
    # 步骤6: 创建数据库表
    print_step(6, "创建数据库表")
    
    print("现在需要在 Supabase 中创建数据库表:")
    print("1. 打开 Supabase Dashboard")
    print("2. 进入 SQL Editor")
    print("3. 复制并执行 backend/database/init.sql 中的内容")
    
    print("\\n📋 SQL 脚本内容:")
    init_sql_path = Path("database/init.sql")
    if init_sql_path.exists():
        print("=" * 50)
        with open(init_sql_path, 'r', encoding='utf-8') as f:
            print(f.read())
        print("=" * 50)
    else:
        print_error("未找到 init.sql 文件")
        return
    
    input("\\n请在 Supabase SQL Editor 中执行上述脚本，完成后按回车继续...")
    
    # 步骤7: 迁移数据
    print_step(7, "迁移数据到数据库")
    
    print("现在开始将 JSON 数据迁移到数据库...")
    
    try:
        from migrate_to_database import DataMigrator
        
        migrator = DataMigrator(str(data_dir), force=False)
        success = await migrator.migrate()
        
        if success:
            print_success("🎉 数据迁移完成!")
            print("\\n📊 迁移统计:")
            print(f"✅ 会话: {migrator.stats['sessions_migrated']} 个")
            print(f"✅ 消息: {migrator.stats['messages_migrated']} 条")
            print(f"✅ 角色: {migrator.stats['roles_migrated']} 个")
            
            if migrator.stats['errors']:
                print(f"⚠️  错误: {len(migrator.stats['errors'])} 个")
                for error in migrator.stats['errors'][:3]:
                    print(f"   - {error}")
        else:
            print_error("数据迁移失败")
            
    except Exception as e:
        print_error(f"迁移过程中出错: {e}")
        import traceback
        traceback.print_exc()
    
    # 步骤8: 完成
    print_step(8, "设置完成")
    
    print("🎊 恭喜！数据库设置完成")
    print("\\n现在你可以:")
    print("1. 在 Supabase Dashboard 中查看和管理数据")
    print("2. 享受更强大的数据库功能")
    print("3. 为将来的多用户功能做好准备")
    
    print("\\n💡 提示:")
    print("- 原 JSON 文件仍然保留作为备份")
    print("- 系统现在会优先使用数据库存储")
    print("- 如果数据库不可用，会自动回退到 JSON 文件")

if __name__ == "__main__":
    asyncio.run(main())